package com.cskaoyan.javase.oop2._1extends._8initialization._3detail;

/**
 * 子类对象初始化过程中的细节问题:
 *      1.在默认情况下,子类对象的初始化,依赖于父类的无参构造器
 *          在这种情况下,如果父类没有无参构造,就会报错.
 *
 *      2.构造器的执行,底层子类的构造器方法栈帧先进栈,向上父类的构造方法栈帧进栈
 *          直到Object类的无参构造方法栈帧
 *          然后从Object类的无参构造方法执行完毕,向下执行完毕
 *
 *      3.构造器的作用是赋值,和创建对象没有关系,构造器执行了也不意味着对象创建了.
 *
 *
 *      4.super关键字以及this关键字在表示调用构造器时,都必须在构造器的第一行
 *          所以它们不可以混用,而且也只能用一次.
 *
 *      5.无论是隐式还是显式子类对象初始化，最终都是为了保证父类构造器代码先于子类执行。
 *
 * @since 14:36
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new Son(18);
    }
}

class Father {
    int num;
    public Father(int num) {
        // super();
        this.num = num;
    }

    public Father() {
    }
}

class Son extends Father {
    int num2;
    int num3;
    String var;

    public Son(int num, int num2, int num3) {
        super(num);
        this.num2 = num2;
        this.num3 = num3;
    }

    public Son(int num2, int num3) {
        // super();
        this.num2 = num2;
        this.num3 = num3;
    }

    public Son(int num, String var) {
        // super();
        // System.out.println("");
        // this(num);
        // Call to 'super()' must be first statement in constructor body
        // super(num);
    }

    public Son(int num) {
        super(num);
    }
    // There is no default constructor available in 'com.cskaoyan.javase.oop2._1extends._8initialization._3detail.Father'
    // public Son() {
    // super();
    // }
}